iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0

前言

Day9 的 List 串列 開始,我們一路上已經認識了集合型態家族的三位成員:

  • List 串列:隨時增刪改的百寶袋
  • Tuple 元組:固定不變的安全箱
  • Set 集合:幫你去重、做集合運算的工具箱

每一種都有它最擅長的場景。
而今天呢,終於輪到壓軸角色登場—— Dictionary 字典 (dict)

字典就像一張「資料對照表」,
可以讓我們用 名字 (key) 直接找到對應的 內容 (value)

比起 List 要靠索引位置,dict 的操作更直覺,也更常出現在真實專案裡。

比如說:

  • 會員系統要「帳號 → 密碼」
  • 點餐系統要「餐點 → 價格」
  • 電話簿要「名字 → 電話號碼」

這些場合,list 或 set 就顯得不太適合,因為我們需要的不是「順序」,
而是 查詢對應關係

而這,就是 dict 的主場!一起往下看吧!

一、什麼是字典 (dict)?

如果說:

  • List 是「有序清單」,
  • Tuple 是「固定不變的清單」,
  • Set 是「去重複的無序袋子」,

那麼 Dictionary (字典) 就是 「一個可以透過名字找到東西的對照表」

它的形式是 key → value (鍵值對):{key:value}

  • key:像名字、編號、代號,必須唯一且不可變
    (數字、字串、Tuple 都可以當 key)
  • value:實際的資料,可以是任何型態
    (數字、字串、List、dict … 都可以)

Python 用 大括號 {} 來表示字典。

student = {
    "id": "S001",
    "name": "Alice",
    "age": 18,
    "courses": ["Python", "Math"]
}

print("學生姓名:",student["name"])   
print("課堂名稱:",student["courses"])  

輸出:

學生姓名: Alice
課堂名稱: ['Python', 'Math']

這邊也可以試試看列印出「年齡」、「id」。(可以自己先試試看!)

print("學生ID:",student["id"])   
print("學生年齡:",student["age"])  

為什麼需要字典?

想像一下,如果用 List 儲存學生資料:

student = ["S001", "Alice", 18, ["Python", "Math"]]
  • 想拿到名字 → 只能用 student[1]
  • 想拿到年齡 → 只能用 student[2]

這樣太難記了!如果資料結構變動,索引位置就全亂。
更何況如果資料量非常大(上萬筆),應該不可能這樣去數索引~
這時候字典就出場了:用「名字」找資料,比用「位置」更直覺。

何時用字典?

  • 需要 快速查詢資料 → 用 key 找比索引快
  • 需要 描述有結構的資訊 → 學生、商品、帳號、設定檔
  • 需要 對應關係 → 像電話簿、翻譯字典、會員編號對應姓名

二、字典的基本操作

1. 建立字典

person = {"name": "Bob", "age": 20}
print(person)

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/2016472127QlR4LAvW.png

也可以用 dict()

person = dict(name="Bob", age=20)

2.取 value值

print(person["name"])   # Bob

輸出:

https://ithelp.ithome.com.tw/upload/images/20251002/20164721YuAnTlbYGL.png

⚠️ 這邊要注意一下!如果 key 不存在會報錯喔!(keyError)

這邊舉個例子:(假設要取不存在key的value)
https://ithelp.ithome.com.tw/upload/images/20251002/20164721hhuJFm7ndA.png

3.新增與修改

  • 程式會去判斷key是否存在,若存在就會把原本的value值改掉(修改)
  • 若判斷key是不存在的,就會視為新增
person["gender"] = "Male"  # 新增
person["age"] = 21         # 修改

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/20164721yn2sfPzYGz.png

4.刪除元素

del person["age"]
gender = person.pop("gender")  # 回傳刪掉的值

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/2016472148KS4jS64t.png

5.遍歷字典

student = {"id": "S001", "name": "Alice", "age": 18}

for key, value in student.items():
    print(key, ":", value)

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/20164721aaNjHNF0W2.png

6.常見方法

print(student.keys())     # dict_keys(['id', 'name', 'age'])
print(student.values())   # dict_values(['S001', 'Alice', 18])
print(student.items())    # dict_items([('id', 'S001'), ('name', 'Alice'), ('age', 18)])

三、四大集合型態統整比較

型態 語法 特性 適用場合
List [] 有序,可變,可重複 任務清單、動態資料
Tuple () 有序,不可變,可重複 固定不變的資料 (生日、座標)
Set {} 無序,不可重複 去重、集合運算
Dict {key:value} 無序,key 唯一,value 可重複 快速查詢、描述結構化資料

四、精選範例

1. 選位系統

tickets = {
    "A1": "空位",
    "A2": "空位",
    "A3": "空位"
}

while True:
    # 檢查是否還有空位
    if "空位" not in tickets.values():
        print("❌ 沒有座位了,所有位置都被訂走了!")
        break

    seat = input("請選擇座位(A1~A3, 輸入 q 離開):")

    if seat == "q":
        break
    elif tickets.get(seat) == "已售出":
        print("⚠️ 這個位置已經有人訂囉!")
    elif tickets.get(seat) == "空位":
        tickets[seat] = "已售出"
        print(f"✅ {seat} 訂票成功!")
    else:
        print("⚠️ 無效座位")

print("\n📋 最終座位狀態:", tickets)

來稍做說明這個範例的一些程式邏輯!:

  • 使用 tickets 字典記錄每個座位的狀態("空位" / "已售出")。
  • 不斷要求使用者輸入座位代碼或 q 離開。
  • 若座位為「空位」就標記為「已售出」;已售出就提醒;
  • 輸入 q 跳出;輸入無效座位則提示。
  • **檢查是否還有空位:**用 if "空位" not in tickets.values() 判斷
    → 若都沒有空位,直接輸出「沒位置了」並結束迴圈。

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/20164721NFG5Wxy3H2.png

2.點餐系統

menu = {
    "漢堡": 50,
    "薯條": 30,
    "可樂": 20,
    "炸雞": 70,
    "沙拉": 40,
    "奶茶": 35,
    "熱狗": 25,
    "冰淇淋": 45
}
print("=====公告:今天是IThome鐵人賽第18天=====")
print("🍴 歡迎光臨!以下是菜單:")
for item, price in menu.items():
    print(f"{item}:{price} 元")

order = []
while True:
    choice = input("請輸入要點的餐點(輸入 q 結束):")
    if choice == "q":
        break
    if choice not in menu:
        print("⚠️ 沒有這個餐點喔,請重新輸入!")
        continue
    order.append(choice)
    print(f"✅ 已加入 {choice}")

# 計算總金額
total = sum(menu[item] for item in order)

print("\n📋 您的點餐清單:", order)
print("💰 總金額:", total, "元")

這邊我會來統整一下我用到的語法以及原因:

  • 這裡用 字典 來存放菜單:
    • Key (鍵):餐點名稱(例如 "漢堡"
    • Value (值):價格(例如 50
  • 這樣設計的好處是:
    • 查餐點價格很快(menu["漢堡"] 就能拿到 50)。
    • 新增或刪除餐點很容易。
  • while True 搭配 break → 讓流程持續,直到使用者輸入 q 才結束。
  • 如果輸入的餐點 不在菜單內 → 提示錯誤,讓使用者重新輸入。continue 會跳過這次的迴圈,不會往下執行!
  • 使用一個 List (串列) order 來存放使用者的點餐紀錄。
  • 每成功輸入一次,就會被存進 order 裡。
  • sum() 搭配 生成式 (generator expression),把點的每個餐點對應的價格加總起來。
  • menu[item] 會從字典中找到該餐點的價格。

輸出:

https://ithelp.ithome.com.tw/upload/images/20251002/20164721jRPRfgiIJF.png

3.副作用查詢系統

# 建立藥品與副作用字典
medicines = {
    "普拿疼": "可能會引起肝臟負擔、噁心",
    "阿莫西林": "可能會導致腹瀉、過敏反應",
    "阿斯匹靈": "可能造成胃部不適、出血風險",
    "抗組織胺": "可能會嗜睡、口乾",
    "類固醇": "可能引起水腫、免疫力下降"
}

print("====藥品副作用查詢系統====")
print("可查詢的藥品有:", ", ".join(medicines.keys()))

while True:
    drug = input("\n請輸入藥品名稱(輸入 q 離開):")
    if drug == "q":
        print("結束查詢!")
        break
    if drug not in medicines:
        print("⚠️ 查無此藥品,請重新輸入!")
        continue
    print(f"✅ {drug} 的副作用:{medicines[drug]}")

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/20164721hOk4mUq8vi.png

4.學生成績查詢系統

這邊會先利用字典建立學生以及成績,
再讓使用者輸入想查詢的學生姓名,
若存在於字典,就會以字典取值的方式將學生的成績輸出。
不存在的話就print查無此人,請重新輸入!

scores={"Sharon":100,"John":77,"Daniel":50}
search = input("請輸入想查詢的學生姓名:")
if search in scores:
    print(search,"的成績是",scores[search])
else:
    print("請重新輸入,查無此人!!")

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/20164721wHI18ouXCE.png

新手常見錯誤

這邊整理出我自己當初在學字典這部分的時候很常搞錯或是忽略的重點:

1.搞混 in 檢查的對象

錯誤示範:


menu = {"漢堡": 50, "薯條": 30}

if 50 in menu:
    print("有 50 元的餐點")
else:
    print("沒有")

輸出:

沒有

正確寫法應該是:

if 50 in menu.values():
    print("有 50 元的餐點")

輸出:

有 50 元的餐點

2.想拿 list 當 key

錯誤示範:


bad_menu = {["漢堡", "薯條"]: 100}

輸出:

TypeError: unhashable type: 'list'

正確寫法:(用Tuple當key)

good_menu = {("漢堡", "薯條"): 100}   

3.迴圈誤以為會拿到key:value

錯誤示範:

menu = {"漢堡": 50, "薯條": 30}

for item in menu:
    print(item)

輸出

漢堡
薯條

正確寫法

for key, value in menu.items():
    print(key, "價格:", value)

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/20164721lLAKFnvgkg.png

五、實戰演練:身分證字號解析器

透過字典(dict)建立身分證字母對應的出生地,並從身分證號解析出性別與出生地。
練習字典查詢、條件判斷與使用者輸入驗證。

# 身分證字母對應出生地字典
places = {
    'A': '臺北市', 'B': '台中市','C': '基隆市','D': '台南市','E': '高雄市',
    'F': '新北市','G': '宜蘭縣', 'H': '桃園市','I': '嘉義市','J': '新竹縣',
    'K': '苗栗縣','L': '台中縣','M': '南投縣','N': '彰化縣','O': '新竹市',
    'P': '雲林縣', 'Q': '嘉義縣','R': '台南縣','S': '高雄縣','T': '屏東縣',
    'U': '花蓮縣','V': '台東縣', 'W': '金門縣','X': '澎湖縣','Y': '陽明市',
    'Z': '連江縣'
}

# 使用者輸入身分證號
pid = input("請輸入身分證字號:")

# 解析性別
gender = int(pid[1]) 

# 解析出生地
birth = pid[0].upper()  # 確保字母是大寫

# 性別判斷
if gender == 1:
    print('先生您好!')
elif gender == 2:
    print('小姐您好!')
else:
    print("⚠️ 請輸入正確的身分證字號,無法辨識性別!")

# 出生地判斷
if birth in places:
    print('出生地:', places[birth])
else:
    print("⚠️ 查無出生地,請確認身分證字號")

輸出:
https://ithelp.ithome.com.tw/upload/images/20251002/20164721QAAvlSMd1s.png

  • 字典使用:
    • places[birth] 直接查詢對應的出生地
    • birth in places 用來檢查輸入的字母是否存在,避免 KeyError
  • 條件判斷:
    • if-elif-else 用於性別判斷與錯誤提示
  • 使用者輸入驗證:
    • pid[0].upper() → 無論輸入小寫或大寫都能正確查找
    • 如果字母或性別位置不正確,會給使用者提示

今日結語

到這裡,我們已經完整走過了 Python 集合型態的四大主角:

  • List:有序、可變,適合需要依序處理的任務
  • Tuple:有序、不可變,適合保存不會改變的重要資料
  • Set:無序、不重複,適合集合運算與去重
  • Dict:無序、Key 唯一,適合快速查詢與描述結構化資料

如果要用一句話來總結:

當你想要「用名字找東西」的時候,就該想到 dict。

我們今天也寫了不少範例對吧!!真是辛苦你們了~
(像是:選位系統、點餐系統、副作用查詢、學生成績查詢、身分證解析器)

這些也告訴我們,字典不只是課本裡的概念,而是真正在專案、
甚至日常生活中都能派上用場的工具。

學會了字典,你就掌握了 Python 中 最靈活、最常見的資料結構

接下來,我們就能開始把四大集合型態組合起來,打造更進階的程式邏輯!!

那麼我們就明天見囉!辛苦啦~


上一篇
【Day17】集合型態第三彈:Set集合-去重、比對、集合運算都靠它
下一篇
【Day19】打包你的程式碼,隨時呼叫!— 函式Function實戰指南(上)
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言